package com.rem.concurrency.multithreading.base;

/**
 * 静态代理：
 * 真实对象和代理对象都要实现统一接口
 * 代理对象要代理真实角色
 * <p>
 * 好处：代理对象可以做很多真实对象做不了的事情
 * 真实对象专注做自己的事情
 *
 * @author Rem
 * @date 2020-10-28
 */

public class StaticProxy {

    @FunctionalInterface
    interface RegisteredCompany {
        /**
         * 注册公司
         */
        void registeredCompany();
    }

    /**
     * 自己注册公司
     */
    static class You implements RegisteredCompany {

        @Override
        public void registeredCompany() {
            System.err.println("自己注册公司····");
        }
    }

    /**
     * 代理公司帮你注册公司
     */
    static class Com implements RegisteredCompany {

        private RegisteredCompany target;

        public Com(RegisteredCompany source) {
            this.target = source;
        }

        @Override
        public void registeredCompany() {
            before();
            System.err.println("代理公司帮你注册公司");
            after();
        }

        private void before() {
            System.err.println("提供身份信息");
        }

        private void after() {
            System.err.println("注册完成，收钱走人");
        }
    }


    public static void main(String[] args) {
        //  Com com = new Com(new You());
        //  com.registeredCompany();

        new Com(new You()).registeredCompany();

        // new Thread(() -> System.err.println("注册注册注册····")).start();

    }
}
